// Copyright 2009 the V8 project authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

#ifndef V8_VERSION_H_
#define V8_VERSION_H_

#include <cstdint>

#include "src/base/functional.h"

namespace v8 {
namespace internal {

    template <typename T>
    class Vector;

    class V8_EXPORT Version {
    public:
        // Return the various version components.
        static int GetMajor() { return major_; }
        static int GetMinor() { return minor_; }
        static int GetBuild() { return build_; }
        static int GetPatch() { return patch_; }
        static const char* GetEmbedder() { return embedder_; }
        static bool IsCandidate() { return candidate_; }
        static uint32_t Hash()
        {
            return static_cast<uint32_t>(
                base::hash_combine(major_, minor_, build_, patch_));
        }

        // Calculate the V8 version string.
        static void GetString(Vector<char> str);

        // Calculate the SONAME for the V8 shared library.
        static void GetSONAME(Vector<char> str);

        static const char* GetVersion() { return version_string_; }

    private:
        // NOTE: can't make these really const because of test-version.cc.
        static int major_;
        static int minor_;
        static int build_;
        static int patch_;
        static const char* embedder_;
        static bool candidate_;
        static const char* soname_;
        static const char* version_string_;

        // In test-version.cc.
        friend void SetVersion(int major, int minor, int build, int patch,
            const char* embedder, bool candidate,
            const char* soname);
    };

} // namespace internal
} // namespace v8

#endif // V8_VERSION_H_
